/**
 * 子应用Token读取工具
 * 子应用只负责从localStorage读取token，不负责刷新和删除
 * 所有token管理由基座应用负责
 */

// Token键名常量
export const TOKEN_KEYS = {
  AUTH_TOKEN: 'auth_token',
  REFRESH_TOKEN: 'refresh_token'
} as const;

/**
 * Token读取类
 */
export class TokenManager {
  /**
   * 获取认证token (Access Token)
   */
  static getAuthToken(): string | null {
    const token = localStorage.getItem(TOKEN_KEYS.AUTH_TOKEN);
    if (!token) {
      console.warn('未找到认证令牌 (auth_token)');
    }
    return token;
  }

  /**
   * 获取刷新token (Refresh Token)
   */
  static getRefreshToken(): string | null {
    const token = localStorage.getItem(TOKEN_KEYS.REFRESH_TOKEN);
    if (!token) {
      console.warn('未找到刷新令牌 (refresh_token)');
    }
    return token;
  }

  /**
   * 检查是否已认证
   */
  static isAuthenticated(): boolean {
    const authToken = this.getAuthToken();
    return !!authToken && authToken.length > 0;
  }

  /**
   * 获取token信息
   */
  static getTokenInfo() {
    const token = this.getAuthToken();
    let tokenPayload = null;
    let expiresAt = null;
    
    if (token) {
      try {
        // 解析JWT token获取payload部分
        const base64Url = token.split('.')[1];
        const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
        tokenPayload = JSON.parse(window.atob(base64));
        
        // 获取过期时间（exp是Unix时间戳，单位为秒）
        if (tokenPayload.exp) {
          expiresAt = tokenPayload.exp * 1000; // 转换为毫秒
        }
      } catch (e) {
        console.error('解析token失败', e);
      }
    }
    
    return {
      authToken: this.getAuthToken(),
      refreshToken: this.getRefreshToken(),
      isAuthenticated: this.isAuthenticated(),
      expiresAt: expiresAt,
      payload: tokenPayload
    };
  }

  /**
   * 检查Access Token是否过期
   * 注意：子应用只负责检查，不负责刷新
   * @returns true表示已过期，false表示未过期
   */
  static isTokenExpired(): boolean {
    const tokenInfo = this.getTokenInfo();
    if (!tokenInfo.expiresAt) {
      console.warn('[TokenManager] 无法获取token过期时间，可能没有有效token');
      return true;
    }
    
    const now = Date.now();
    const isExpired = now > tokenInfo.expiresAt;
    
    if (isExpired) {
      console.warn(`[TokenManager] Token已过期，过期时间：${new Date(tokenInfo.expiresAt).toLocaleString()}`);
    } else {
      const remainingTime = Math.floor((tokenInfo.expiresAt - now) / 1000 / 60); // 剩余分钟数
      console.log(`[TokenManager] Token有效，剩余时间：${remainingTime}分钟`);
    }
    
    return isExpired;
  }
  
  /**
   * 清除认证Token
   * 子应用通常不应直接调用此方法，而是通过基座应用清除登录状态
   * 此方法主要用于独立运行模式下的测试和调试
   */
  static clearAuthToken(): void {
    console.warn('[TokenManager] 子应用调用了clearAuthToken方法，通常这应该由基座应用完成');
    localStorage.removeItem(TOKEN_KEYS.AUTH_TOKEN);
  }
  
  /**
   * 清除所有Token
   * 子应用通常不应直接调用此方法，而是通过基座应用清除登录状态
   * 此方法主要用于独立运行模式下的测试和调试
   */
  static clearTokens(): void {
    console.warn('[TokenManager] 子应用调用了clearTokens方法，通常这应该由基座应用完成');
    localStorage.removeItem(TOKEN_KEYS.AUTH_TOKEN);
    localStorage.removeItem(TOKEN_KEYS.REFRESH_TOKEN);
  }

  /**
   * 调试用：输出当前token状态
   */
  static debugTokens(): void {
    const authToken = this.getAuthToken();
    const refreshToken = this.getRefreshToken();
    console.log('[TokenManager] 当前令牌状态:');
    console.log('认证令牌(auth_token):', authToken ? `${authToken.substring(0, 10)}...` : 'null');
    console.log('刷新令牌(refresh_token):', refreshToken ? `${refreshToken.substring(0, 10)}...` : 'null');
    
    if (authToken) {
      this.isTokenExpired();
    }
  }
}

// 导出默认实例
export default TokenManager; 